/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ventas.beans;

import datamodel.EntidadesElegidasDataModel;
import entities.Producto;
import entities.PvpInternacional;
import entities.Usuario;
import facades.NivelPrecioFacade;
import facades.PaisFacade;
import facades.PvpInternacionalFacade;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Date;
import java.util.Iterator;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import org.apache.commons.collections.map.MultiKeyMap;
import productos.datamodel.ListaProductos;
import qualifiers.EventoEntidadCreada;
import qualifiers.EventoEntidadesElegidas;
import qualifiers.UsuarioLogeado;

/**
 *
 * @author damfercer
 */
@Named(value = "productosPvpBean")
@SessionScoped
public class ProductosPvpBean extends ListaProductos implements Serializable {
    private MultiKeyMap pvpInternacionalMap;
    private List<PvpInternacional> paisesYNiveles;
    private PvpInternacional paisYNivelCollector;
    @Inject
    private PvpInternacionalFacade pvpInternacionalFacade;
    @Inject
    private NivelPrecioFacade nivelPrecioFacade;
    @Inject
    private PaisFacade paisFacade;
    @Inject
    @UsuarioLogeado
    Usuario usuarioLogeado;
    /**
     * Creates a new instance of ProductosPvpBean
     */
    public ProductosPvpBean() {
        paisesYNiveles=new ArrayList<PvpInternacional>();
        pvpInternacionalMap=new MultiKeyMap();
        paisYNivelCollector=new PvpInternacional();
    }
    
    public void onProductosElegidos(@Observes @EventoEntidadesElegidas EntidadesElegidasDataModel productosElegidos){
        paisesYNiveles=new ArrayList<PvpInternacional>();
        pvpInternacionalMap=new MultiKeyMap();
        paisYNivelCollector=new PvpInternacional();
    }
    
    public void addPaisYNivel(){
        paisesYNiveles.add(paisYNivelCollector);
        paisYNivelCollector=new PvpInternacional();
    }

    /**
     * @return the paises
     */
    public List<PvpInternacional> getPaisesYNiveles() {
        return paisesYNiveles;
    }

    /**
     * @param paisesYNiveles
     */
    public void setPaises(List<PvpInternacional> paisesYNiveles) {
        this.paisesYNiveles = paisesYNiveles;
    }

    /**
     * @return the paisCollector
     */
    public PvpInternacional getPaisYNivelCollector() {
        return paisYNivelCollector;
    }

    /**
     * @param paisYNivelCollector
     */
    public void setPaisYNivelCollector(PvpInternacional paisYNivelCollector) {
        this.paisYNivelCollector = paisYNivelCollector;
    }
    
    public void borrarPaisYnivel(PvpInternacional p){
        for (Iterator<PvpInternacional> iter=paisesYNiveles.iterator();iter.hasNext();) {
            PvpInternacional pvpInternacionalIter=iter.next();
            if(pvpInternacionalIter.getPais().equals(p.getPais()) && pvpInternacionalIter.getNivelPrecio().equals(p.getNivelPrecio())){
                iter.remove();
            }
        }
    }
    
    public PvpInternacional recuperarPvpInternacionalDeProductoNivelPrecioYPais(Producto producto, PvpInternacional pvpInternacional){
        if(!pvpInternacionalMap.containsKey(pvpInternacional.getPais().getIdPais(), pvpInternacional.getNivelPrecio().getIdNivelPrecio(), producto.getIdProducto())){
            PvpInternacional pvpInternacionalAdd=pvpInternacionalFacade.getPvpInternacionalDeProductoNivelPrecioYPais(producto, pvpInternacional.getPais(), pvpInternacional.getNivelPrecio());
            if(pvpInternacionalAdd==null){
                pvpInternacionalAdd=new PvpInternacional();
                pvpInternacionalAdd.setPvp(new BigDecimal(BigInteger.ZERO));
                pvpInternacionalAdd.setPais(pvpInternacional.getPais());
                pvpInternacionalAdd.setProducto(producto);
                pvpInternacionalAdd.setNivelPrecio(pvpInternacional.getNivelPrecio());
            }
            pvpInternacionalMap.put(pvpInternacionalAdd.getPais().getIdPais(), pvpInternacionalAdd.getNivelPrecio().getIdNivelPrecio(), pvpInternacionalAdd.getProducto().getIdProducto(), pvpInternacionalAdd);
        }
        return (PvpInternacional)pvpInternacionalMap.get(pvpInternacional.getPais().getIdPais(), pvpInternacional.getNivelPrecio().getIdNivelPrecio(), producto.getIdProducto());
    }
    
    public void guardarPvpInternacional(Producto producto, PvpInternacional pvpI){
        Date ahora=new Date();
        PvpInternacional pvpInternacional=(PvpInternacional)pvpInternacionalMap.get(pvpI.getPais().getIdPais(), pvpI.getNivelPrecio().getIdNivelPrecio(), producto.getIdProducto());
        if(pvpInternacional.getIdPvpInternacional()==null){
            if(pvpInternacional.getPvp().compareTo(BigDecimal.ONE)>0){
                pvpInternacional.setFechaCreacion(ahora);
                pvpInternacional.setUltimaFecha(ahora);
                pvpInternacional.setUsuarioCreador(usuarioLogeado);
                pvpInternacional.setUltimoUsuario(usuarioLogeado);
                pvpInternacionalFacade.create(pvpInternacional);
                pvpInternacional.getProducto().getPvpInternacionalList().add(pvpInternacional);
                pvpInternacional.getPais().getPvpInternacionalList().add(pvpInternacional);
            }
        }
        else{
            if(pvpInternacional.getPvp().compareTo(BigDecimal.ONE)>0){
                pvpInternacional.setUltimaFecha(ahora);
                pvpInternacional.setUltimoUsuario(usuarioLogeado);
                pvpInternacionalFacade.edit(pvpInternacional);
                for(Iterator<PvpInternacional> iter=pvpInternacional.getProducto().getPvpInternacionalList().iterator();iter.hasNext();){
                    PvpInternacional old=iter.next();
                    if(old.equals(pvpInternacional)){
                        iter.remove();
                    }
                }
                
                for(Iterator<PvpInternacional> iter=pvpInternacional.getPais().getPvpInternacionalList().iterator();iter.hasNext();){
                    PvpInternacional old=iter.next();
                    if(old.equals(pvpInternacional)){
                        iter.remove();
                    }
                }
                pvpInternacional.getProducto().getPvpInternacionalList().add(pvpInternacional);
                pvpInternacional.getPais().getPvpInternacionalList().add(pvpInternacional);
            }
            else{
                for(Iterator<PvpInternacional> iter=pvpInternacional.getProducto().getPvpInternacionalList().iterator();iter.hasNext();){
                    PvpInternacional old=iter.next();
                    if(old.equals(pvpInternacional)){
                        pvpInternacionalFacade.remove(old);
                        iter.remove();
                    }
                }
                
                for(Iterator<PvpInternacional> iter=pvpInternacional.getPais().getPvpInternacionalList().iterator();iter.hasNext();){
                    PvpInternacional old=iter.next();
                    if(old.equals(pvpInternacional)){
                        pvpInternacionalFacade.remove(old);
                        iter.remove();
                    }
                }
            }
        }
    }
    
    
    public void onEntidadCreadaPvp(@Observes @EventoEntidadCreada Producto p){
        this.getListadoEntidades().add(p);
        PvpInternacional pvp=new PvpInternacional();
        pvp.setFechaCreacion(new Date());
        pvp.setNivelPrecio(nivelPrecioFacade.getNivelPrecioNormal());
        pvp.setPais(paisFacade.getSpain());
        pvp.setProducto(p);
        pvp.setUltimaFecha(new Date());
        pvp.setUltimoUsuario(usuarioLogeado);
        pvp.setUsuarioCreador(usuarioLogeado);
        pvp.setPvp(p.getPvp());
        pvpInternacionalFacade.create(pvp);
    }
}
